/*
题目: 连续数组
给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组，并返回该子数组的长度。

https://leetcode.cn/problems/contiguous-array/
 */
public class FindMaxLength {
    public int findMaxLength(int[] nums) {
        // 关键字眼: 最长连续, 想到记录第一次出现某个状态的位置
        int n = nums.length;
        // 思路 : 0 和 1 长度相等, 我们遇到 1 就 +1, 遇到 0 就 -1
        // 记录这种情况下第一次出现的位置, 如果两次状态相同, 说明中间一段符合要求

        Map<Integer, Integer> map = new HashMap<> ();
        int counter = 0, maxn = 0;
        map.put(0, -1);// 处理整个字符串都满足的情况
        for (int i = 0; i < n; i ++) {
            if (nums[i] == 1)   counter ++;
            else                counter --;

            if (map.containsKey(counter)) {
                maxn = Math.max(maxn, i - map.get(counter));
            } else {
                map.put(counter, i);
            }
        }

        return maxn;
    }
}
